package main

import (
	"fmt"
	"github.com/streadway/amqp"
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"
)

const (
	rabbitMQURL  = "amqp://user:password@172.16.168.58:5672/" // 使用你Docker容器的配置
	queueName    = "imgurl"
	messageCount = 10
)

// 扫描目录获取所有 JPG 文件名
func ScanJpgFilenames(rootDir string) ([]string, error) {
	var jpgFiles []string

	// 验证目录有效性
	if stat, err := os.Stat(rootDir); err != nil || !stat.IsDir() {
		return nil, fmt.Errorf("无效的目录: %s", rootDir)
	}

	// 遍历文件系统
	err := filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return fmt.Errorf("访问路径失败 %q: %v", path, err)
		}

		// 跳过目录和隐藏文件（可选）
		if info.IsDir() || info.Name()[0] == '.' {
			return nil
		}

		// 扩展名匹配（支持大小写）
		ext := strings.ToLower(filepath.Ext(path))
		if ext == ".jpg" || ext == ".jpeg" {
			jpgFiles = append(jpgFiles, filepath.Base(path))
		}
		return nil
	})

	return jpgFiles, err
}

func produceMessages(filelist []string) {
	// 1. 连接到RabbitMQ服务器
	conn, err := amqp.Dial(rabbitMQURL)
	failOnError(err, "Failed to connect to RabbitMQ")
	defer conn.Close()

	// 2. 创建通道
	ch, err := conn.Channel()
	failOnError(err, "Failed to open a channel")
	defer ch.Close()

	// 3. 声明队列（幂等操作，只有队列不存在时才会创建）
	q, err := ch.QueueDeclare(
		queueName, // 队列名称
		true,      // 持久化队列（Durable）
		false,     // 自动删除（Auto-delete）
		false,     // 排他队列（Exclusive）
		false,     // 无等待（No-wait）
		nil,       // 额外参数
	)
	failOnError(err, "Failed to declare a queue")

	// 4. 发送10条消息
	for  _,url_name := range filelist {
		body :=  url_name
		err = ch.Publish(
			"",     // 使用默认交换机
			q.Name, // 路由键（这里直接使用队列名称）
			false,  // 强制标志（Mandatory）
			false,  // 立即标志（Immediate）
			amqp.Publishing{
				DeliveryMode: amqp.Persistent, // 持久化消息
				ContentType:  "text/plain",
				Body:         []byte(body),
				Timestamp:    time.Now(),
			})
		failOnError(err, "Failed to publish a message")
		fmt.Printf(" [x] Sent %s\n", body)
		time.Sleep(1 * time.Millisecond) // 添加延迟方便观察
	}
}

// 错误处理辅助函数
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	if len(os.Args) < 2 {
		fmt.Println("请指定扫描目录，如: ./jpgscan /path/to/images")
		return
	}

	targetDir := os.Args[1]
	// /app/qw/qwen2.5vl-vllm/webfile
	files, err := ScanJpgFilenames(targetDir)
	if err != nil {
		fmt.Printf("扫描失败: %v\n", err)
		return
	}
       produceMessages(files)
}
